home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / mus / edit / QuadraComp.lha / QuadraComposer / QCReplay.s < prev    next >
Text File  |  1993-03-16  |  22KB  |  1,140 lines

  1. * This replayroutine was written by Bo Lincoln (Eternal).
  2. * Copyright © 1993 Technological Artwork. All rights reserved.
  3. * You may use this routine in your programs.
  4. * This is the normal routine.
  5. * Worst case is about 20(?) rasterlines.
  6. * How to use: Call QC_init to init the mod.
  7. *             Call QC_music every vertical blank.
  8. *             Call QC_end to stop.
  9. *             The EMOD should be at QC_data.
  10. * You can not use Tempo in this routine.
  11.               
  12. QC_dmawait = 6            ;How many rasterrows it waits for dma
  13.                 ;(2 times).
  14.  
  15.     section QC,code_c
  16.  
  17.     
  18. s:    move.w $dff01c,-(sp)
  19.     move.w #$7fff,$dff09a
  20.     bsr QC_init
  21. .loop:    bsr QC_music
  22. .loop2:    cmp.b #70,$dff006
  23.     bne .loop2
  24. .loop3:    cmp.b #70,$dff006
  25.     beq .loop3
  26.     btst #6,$bfe001
  27.     bne .loop
  28.     bsr QC_end
  29.     move.w (sp)+,d0
  30.     or.w #$8000,d0
  31.     move.w d0,$dff09a
  32.     rts
  33.  
  34. QC_init:lea QC_data(pc),a0        ;Check if the module is ok
  35.     cmp.l #"FORM",(a0)
  36.     bne QC_initerr
  37.     cmp.l #"EMOD",8(a0)
  38.     bne QC_initerr
  39.     cmp.l #"EMIC",12(a0)
  40.     bne QC_initerr
  41.     cmp.w #1,20(a0)
  42.     bne QC_initerr
  43.  
  44.     or.b #$2,$bfe001
  45.     moveq #0,d7        ;Get the adresses to the sampleinfos
  46.     move.b 63(a0),d7    ;and init the real adresses in the infos
  47.     subq #1,d7
  48.     lea 64(a0),a0
  49.     lea QC_samplepointers(pc),a1
  50. QC_sploop:moveq #0,d0
  51.     move.b (a0),d0
  52.     add.w d0,d0
  53.     add.w d0,d0
  54.     move.l a0,(a1,d0.w)
  55.     add.l #QC_data,30(a0)
  56.     move.l 30(a0),a2
  57.     clr.w (a2)
  58.     lea 34(a0),a0
  59.     dbf d7,QC_sploop
  60.  
  61.     lea QC_patternpointers(pc),a1    ;Get the patternadresses
  62.     moveq #0,d7
  63.     addq #1,a0
  64.     move.b (a0)+,d7
  65.     subq #1,d7
  66. QC_pploop:moveq #0,d0
  67.     move.b (a0),d0
  68.     add.w d0,d0
  69.     add.w d0,d0
  70.     move.l a0,(a1,d0.w)
  71.     add.l #QC_data,22(a0)
  72.     lea 26(a0),a0
  73.     dbf d7,QC_pploop
  74.  
  75.     clr.w QC_nrofpos
  76.     move.b (a0)+,QC_nrofpos+1    
  77.     move.l a0,QC_posstart
  78.     moveq #0,d0
  79.     move.b (a0),d0
  80.     add.w d0,d0
  81.     add.w d0,d0
  82.     move.l (a1,d0.w),a1
  83.     move.l 22(a1),QC_currpattpointer    
  84.     move.b 1(a1),QC_breakrow+1
  85.     move.w #6,QC_speed
  86.     move.w QC_speed(pc),QC_speedcount
  87.     clr.b QC_newposflag
  88.     clr.w QC_rowcount
  89.     clr.w QC_pos
  90.     move.w #1,t_length+QC_chan1
  91.     move.w #1,t_length+QC_chan2
  92.     move.w #1,t_length+QC_chan3
  93.     move.w #1,t_length+QC_chan4
  94.     move.w #1,t_replen+QC_chan1
  95.     move.w #1,t_replen+QC_chan2
  96.     move.w #1,t_replen+QC_chan3
  97.     move.w #1,t_replen+QC_chan4
  98.     moveq #0,d0
  99. QC_end:    move.w #$f,$dff096
  100.     clr.w $dff0a8
  101.     clr.w $dff0b8
  102.     clr.w $dff0c8
  103.     clr.w $dff0d8
  104.     rts        
  105. QC_initerr:moveq #-1,d0
  106.     rts
  107.  
  108. QC_music:
  109.     addq.w #1,QC_speedcount
  110.     move.w QC_speed,d0
  111.     cmp.w QC_speedcount,d0
  112.     bgt QC_nonew
  113.     tst.b QC_pattwait
  114.     beq QC_getnotes
  115.     subq.b #1,QC_pattwait
  116.     clr.w QC_speedcount
  117.  
  118. QC_nonew:lea QC_samplepointers(pc),a4
  119.     lea QC_periods(pc),a3
  120.     lea QC_chan1(pc),a6
  121.     lea $dff0a0,a5
  122.     bsr QC_chkplayfx
  123.     lea QC_chan2-QC_chan1(a6),a6
  124.     lea $10(a5),a5
  125.     bsr QC_chkplayfx
  126.     lea QC_chan2-QC_chan1(a6),a6
  127.     lea $10(a5),a5
  128.     bsr QC_chkplayfx
  129.     lea QC_chan2-QC_chan1(a6),a6
  130.     lea $10(a5),a5    
  131.     bsr QC_chkplayfx
  132.  
  133.     tst.w QC_dmacon
  134.     beq QC_mend
  135.     move.w QC_dmacon(pc),$dff096
  136.     moveq #QC_dmawait,d7
  137. QC_wait6:move.b $dff006,d0    
  138. QC_wait5:cmp.b $dff006,d0
  139.     beq QC_wait5
  140.     dbf d7,QC_wait6
  141.     or.w #$8000,QC_dmacon
  142.     move.w QC_dmacon(pc),$dff096
  143.     moveq #QC_dmawait,d7
  144. QC_wait8:move.b $dff006,d0    
  145. QC_wait7:cmp.b $dff006,d0
  146.     beq QC_wait7
  147.     dbf d7,QC_wait8
  148.     clr.w QC_dmacon
  149.     lea QC_chan1+t_repeat(pc),a0
  150.     lea $dff000,a5
  151.     move.l (a0),$a0(a5)    
  152.     move.w 4(a0),$a4(a5)
  153.     move.l QC_chan2-QC_chan1(a0),$b0(a5)    
  154.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  155.     move.l QC_chan3-QC_chan1(a0),$c0(a5)    
  156.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  157.     move.l QC_chan4-QC_chan1(a0),$d0(a5)    
  158.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  159.     rts
  160.     
  161.  
  162. QC_chkplayfx:
  163.     lea QC_playfx(pc),a2
  164.     move.b t_cmd(a6),d0
  165.     and.w #$f,d0
  166.     add.w d0,d0    
  167.     add.w d0,d0    
  168.     move.l (a2,d0.w),a0
  169.     jmp (a0)    
  170.     
  171. QC_getnotes:
  172.     clr.w QC_speedcount
  173.     move.l QC_currpattpointer(pc),a0
  174.     move.w QC_rowcount(pc),d0
  175.     asl.w #4,d0
  176.     add.w d0,a0
  177.     lea QC_samplepointers(pc),a4
  178.     lea QC_periods(pc),a3
  179.     
  180.     lea $dff0a0,a5
  181.     lea QC_chan1(pc),a6
  182.     bsr QC_playnote
  183.     lea $10(a5),a5
  184.     lea QC_chan2-QC_chan1(a6),a6
  185.     bsr QC_playnote
  186.     lea $10(a5),a5
  187.     lea QC_chan2-QC_chan1(a6),a6
  188.     bsr QC_playnote
  189.     lea $10(a5),a5
  190.     lea QC_chan2-QC_chan1(a6),a6
  191.     bsr QC_playnote
  192.     tst.w QC_dmacon
  193.     beq QC_update
  194.  
  195.     move.w QC_dmacon(pc),$dff096
  196.     moveq #QC_dmawait,d7
  197. QC_wait2:move.b $dff006,d0    
  198. QC_wait1:cmp.b $dff006,d0
  199.     beq QC_wait1
  200.     dbf d7,QC_wait2
  201.     or.w #$8000,QC_dmacon
  202.     move.w QC_dmacon(pc),$dff096
  203.     moveq #QC_dmawait,d7
  204. QC_wait4:move.b $dff006,d0    
  205. QC_wait3:cmp.b $dff006,d0
  206.     beq QC_wait3
  207.     dbf d7,QC_wait4
  208.     clr.w QC_dmacon
  209.     lea QC_chan1+t_repeat(pc),a0
  210.     lea $dff000,a5
  211.     move.l (a0),$a0(a5)    
  212.     move.w 4(a0),$a4(a5)
  213.     move.l QC_chan2-QC_chan1(a0),$b0(a5)    
  214.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  215.     move.l QC_chan3-QC_chan1(a0),$c0(a5)    
  216.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  217.     move.l QC_chan4-QC_chan1(a0),$d0(a5)    
  218.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  219.  
  220. QC_update:tst.b QC_newposflag
  221.     beq QC_tstend
  222.     clr.b QC_newposflag
  223.     move.w QC_newposnr,QC_pos
  224.     bra QC_newpos
  225. QC_tstend:tst.b QC_jumpbreakflag
  226.     beq QC_tstend2
  227.     clr.b QC_jumpbreakflag
  228.     move.w QC_looprow(pc),d0
  229.     cmp.w QC_breakrow(pc),d0
  230.     bgt QC_mend
  231.     move.w d0,QC_rowcount
  232.     rts
  233. QC_tstend2:    
  234.     addq.w #1,QC_rowcount
  235.     move.w QC_rowcount(pc),d0
  236.     cmp.w QC_breakrow(pc),d0
  237.     ble QC_mend
  238.     addq.w #1,QC_pos
  239. QC_newpos:move.w QC_pos(pc),d0
  240.     cmp.w QC_nrofpos(pc),d0
  241.     blt QC_getpos
  242.     clr.w QC_pos
  243.     moveq #0,d0
  244. QC_getpos:move.l QC_posstart(pc),a0
  245.     move.b (a0,d0.w),d0
  246.     add.w d0,d0
  247.     add.w d0,d0
  248.     lea QC_patternpointers(pc),a0
  249.     move.l (a0,d0.w),a0
  250.     move.l 22(a0),QC_currpattpointer
  251.     move.b 1(a0),QC_breakrow+1
  252.     move.w QC_newrow(pc),QC_rowcount
  253.     clr.w QC_newrow
  254.     move.w QC_breakrow,d0
  255.     cmp.w QC_rowcount,d0
  256.     bge QC_mend
  257.     move.w d0,QC_rowcount
  258. QC_mend:rts
  259.  
  260. QC_playnote:move.l (a0)+,(a6)
  261.     moveq #0,d0
  262.     move.b (a6),d0
  263.     beq QC_isnote
  264.     add.w d0,d0
  265.     add.w d0,d0
  266.     move.l (a4,d0.w),a1
  267.     move.b 1(a1),t_volume+1(a6)
  268.     move.b 25(a1),d0
  269.     and.w #$f,d0
  270.     add.w d0,d0
  271.     add.w d0,d0
  272.     move.l (a3,d0.w),t_finetune(a6)
  273.     move.l 30(a1),d1
  274.     move.l d1,t_start(a6)
  275.     move.w t_volume(a6),8(a5)
  276.     btst #0,24(a1)
  277.     beq QC_noloop
  278.     moveq #0,d0
  279.     move.w 26(a1),d0
  280.     add.l d0,d1
  281.     add.l d0,d1
  282.     move.l d1,t_repeat(a6)
  283.     moveq #0,d0
  284.     move.w 26(a1),d0
  285.     moveq #0,d1
  286.     move.w 28(a1),d1
  287.     add.l d0,d1
  288.     move.w d1,t_length(a6)
  289.     move.w 28(a1),t_replen(a6)
  290.     bra QC_isnote
  291. QC_noloop:clr.l t_repeat(a6)
  292.     move.w #$1,t_replen(a6)
  293.     move.w 2(a1),t_length(a6)
  294. QC_isnote:
  295.     tst.b t_notenr(a6)
  296.     blt QC_chkfirstfx
  297.     move.b t_notenr(a6),t_notenr2+1(a6)
  298.     move.w t_cmd(a6),d0
  299.     and.w #$ff0,d0
  300.     cmp.w #$e50,d0
  301.     beq QC_setfinetunefirst
  302.     and.w #$f00,d0
  303.     cmp.w #$300,d0
  304.     beq QC_settoneport
  305.     cmp.w #$500,d0
  306.     beq QC_settoneport
  307. QC_getper:move.w t_notenr2(a6),d0
  308.     add.w d0,d0
  309.     move.l t_finetune(a6),a2
  310.     move.w (a2,d0.w),t_period(a6)
  311.     move.w t_cmd(a6),d0
  312.     and.w #$ff0,d0
  313.     cmp.w #$ed0,d0
  314.     beq QC_notedelay
  315.     move.w t_dmabit(a6),d0
  316.     or.w d0,QC_dmacon
  317.     move.l t_start(a6),(a5)
  318.     move.w t_length(a6),4(a5)
  319.     move.w t_period(a6),6(a5)
  320. QC_chkfirstfx:
  321.     lea QC_fxaftersetperiod(pc),a2
  322.     moveq #0,d0
  323.     move.b t_cmd(a6),d0
  324.     add.w d0,d0
  325.     add.w d0,d0
  326.     move.l (a2,d0.w),a2
  327.     jmp (a2)
  328.  
  329. QC_setfinetunefirst:
  330.     move.b t_cmdarg(a6),d0
  331.     add.w d0,d0
  332.     add.w d0,d0
  333.     move.l (a3,d0.w),t_finetune(a6)
  334.     bra QC_getper
  335.             
  336. QC_ecommands:
  337.     lea QC_efx(pc),a2
  338.     move.b t_cmdarg(a6),d0
  339.     and.w #$f0,d0
  340.     lsr.w #2,d0
  341.     move.l (a2,d0.w),a2
  342.     jmp (a2) 
  343.  
  344. QC_playecommands:
  345.     lea QC_playefx(pc),a2
  346.     move.b t_cmdarg(a6),d0
  347.     and.w #$f0,d0
  348.     lsr.w #2,d0
  349.     move.l (a2,d0.w),a2
  350.     jmp (a2) 
  351.  
  352. ********** Effect commands **********
  353.  
  354. QC_arpeggio:
  355.     tst.b t_cmdarg(a6)
  356.     beq QC_mend
  357.     move.w QC_speedcount,d0
  358.     lea QC_arptbl,a2
  359.     tst.b (a2,d0.w)
  360.     beq QC_arp2
  361.     blt QC_arp1
  362.     move.b t_cmdarg(a6),d0
  363.     and.w #$f,d0
  364.     add.w t_notenr2(a6),d0
  365.     add.w d0,d0
  366.     move.l t_finetune(a6),a2    
  367.     move.w (a2,d0.w),6(a5)    
  368.     rts
  369. QC_arp1:move.w t_period(a6),6(a5)
  370.     rts
  371. QC_arp2:moveq #0,d0
  372.     move.b t_cmdarg(a6),d0
  373.     lsr.w #4,d0
  374.     add.w t_notenr2(a6),d0
  375.     add.w d0,d0    
  376.     move.l t_finetune(a6),a2
  377.     move.w (a2,d0.w),6(a5)    
  378.     rts
  379.  
  380. QC_slideup:
  381.     moveq #0,d0            
  382.     move.b t_cmdarg(a6),d0        
  383.     sub.w d0,t_period(a6)        
  384.     cmp.w #113,t_period(a6)        
  385.     bgt QC_sunotlow
  386.     move.w #113,t_period(a6)
  387. QC_sunotlow:
  388.     move.w t_period(a6),6(a5)
  389.     rts    
  390.  
  391. QC_slidedown:
  392.     moveq #0,d0
  393.     move.b t_cmdarg(a6),d0
  394.     add.w d0,t_period(a6)
  395.     cmp.w #856,t_period(a6)
  396.     blt QC_sdnothigh
  397.     move.w #856,t_period(a6)
  398. QC_sdnothigh:
  399.     move.w t_period(a6),6(a5)
  400.     rts    
  401.  
  402. QC_settoneport:
  403.     move.w t_notenr2(a6),d0
  404.     add.w d0,d0
  405.     move.l t_finetune(a6),a2
  406.     move.w (a2,d0.w),d0
  407.     move.w d0,t_wantedperiod(a6)
  408.     cmp.w t_period(a6),d0    
  409.     bgt QC_setportdown
  410.     clr.b t_portdir(a6)
  411.     rts
  412. QC_setportdown:
  413.     move.b #1,t_portdir(a6)
  414.     rts    
  415.  
  416. QC_toneport:
  417.     tst.w t_wantedperiod(a6)
  418.     beq QC_mend
  419.     moveq #0,d0
  420.     move.b t_cmdarg(a6),d0
  421.     beq QC_tpold
  422.     move.b d0,t_portspeed(a6)
  423.     tst.b t_portdir(a6)
  424.     bne QC_portdown
  425.     sub.w d0,t_period(a6)
  426.     move.w t_wantedperiod(a6),d0
  427.     cmp.w t_period(a6),d0
  428.     blt QC_notyetwanted
  429.     move.w d0,6(a5)
  430.     move.w d0,t_period(a6)
  431.     clr.w t_wantedperiod(a6)
  432.     rts
  433. QC_tpold:move.b t_portspeed(a6),d0
  434.     tst.b t_portdir(a6)
  435.     bne QC_portdown
  436.     sub.w d0,t_period(a6)
  437.     move.w t_wantedperiod(a6),d0
  438.     cmp.w t_period(a6),d0
  439.     blt QC_notyetwanted
  440.     move.w d0,6(a5)
  441.     move.w d0,t_period(a6)
  442.     clr.w t_wantedperiod(a6)
  443.     rts
  444. QC_portdown:
  445.     add.w d0,t_period(a6)
  446.     move.w t_wantedperiod(a6),d0
  447.     cmp.w t_period(a6),d0
  448.     bgt QC_notyetwanted
  449.     move.w d0,6(a5)
  450.     move.w d0,t_period(a6)
  451.     clr.w t_wantedperiod(a6)
  452.     rts
  453. QC_notyetwanted:
  454.     tst.b t_glisscont(a6)
  455.     beq QC_nogliss
  456.     move.l t_finetune(a6),a2
  457.     move.w t_period(a6),d0
  458. QC_glissloop:
  459.     cmp.w (a2)+,d0
  460.     blt QC_glissloop
  461.     move.w -2(a2),6(a5)
  462.     rts
  463. QC_nogliss:
  464.     move.w t_period(a6),6(a5)
  465.     rts
  466.     
  467. QC_vibrato:
  468.     moveq #0,d0
  469.     move.b t_vibwave(a6),d0
  470.     asl.w #7,d0
  471.     lea QC_vibtables(pc),a2
  472.     add.w d0,a2
  473.     moveq #0,d0
  474.     move.b t_cmdarg(a6),d0
  475.     beq QC_vib    
  476.     move.w d0,d1
  477.     and.b #$f,d0
  478.     beq QC_vibusespeed
  479.     and.b #$f0,t_vibcmd(a6)
  480.     or.b d0,t_vibcmd(a6)
  481. QC_vibusespeed:
  482.     and.b #$f0,d1
  483.     beq QC_vib
  484.     and.b #$f,t_vibcmd(a6)
  485.     or.b d1,t_vibcmd(a6)
  486. QC_vib:    move.b t_vibcmd(a6),d0
  487.     lsr.w #3,d0
  488.     add.w d0,t_vibpos(a6)
  489.     and.w #$7e,t_vibpos(a6)
  490.     move.w t_vibpos(a6),d0
  491.     move.w t_period(a6),d1
  492.     move.w (a2,d0.w),d0
  493.     move.b t_vibcmd(a6),d2
  494.     and.w #$f,d2
  495.     muls d2,d0
  496.     add.l d0,d0
  497.     add.l d0,d0
  498.     swap d0
  499.     add.w d0,d1
  500.     cmp.w #856,d1
  501.     blt QC_vibnothigh
  502.     move.w #856,d1
  503. QC_vibnothigh:
  504.     cmp.w #113,d1
  505.     bgt QC_vibnotlow
  506.     moveq #113,d1
  507. QC_vibnotlow:
  508.     move.w d1,6(a5)
  509.     rts    
  510.  
  511. QC_toneportandvolslide:
  512.     tst.w t_wantedperiod(a6)
  513.     beq QC_volslide
  514.     bsr QC_tpold
  515.     bra QC_volslide
  516.  
  517. QC_vibratoandvolslide:
  518.     bsr QC_vib
  519.     bra QC_volslide
  520.  
  521. QC_tremolo:
  522.     moveq #0,d0
  523.     move.b t_tremwave(a6),d0
  524.     asl.w #7,d0
  525.     lea QC_vibtables(pc),a2
  526.     add.w d0,a2
  527.     moveq #0,d0
  528.     move.b t_cmdarg(a6),d0
  529.     beq QC_trem    
  530.     move.w d0,d1
  531.     and.b #$f,d0
  532.     beq QC_tremusespeed
  533.     and.b #$f0,t_tremcmd(a6)
  534.     or.b d0,t_tremcmd(a6)
  535. QC_tremusespeed:
  536.     and.b #$f0,d1
  537.     beq QC_trem
  538.     and.b #$f,t_tremcmd(a6)
  539.     or.b d1,t_tremcmd(a6)
  540. QC_trem:move.b t_tremcmd(a6),d0
  541.     lsr.w #3,d0
  542.     add.w d0,t_trempos(a6)
  543.     and.w #$7e,t_trempos(a6)
  544.     move.w t_trempos(a6),d0
  545.     move.w t_volume(a6),d1
  546.     move.w (a2,d0.w),d0
  547.     move.b t_tremcmd(a6),d2
  548.     and.w #$f,d2
  549.     muls d2,d0
  550.     asl.l #3,d0
  551.     swap d0
  552.     add.w d0,d1
  553.     cmp.w #40,d1
  554.     blt QC_tremnothigh
  555.     move.w #40,d1
  556. QC_tremnothigh:
  557.     tst.w d1
  558.     bgt QC_tremnotlow
  559.     moveq #0,d1
  560. QC_tremnotlow:
  561.     move.w d1,8(a5)
  562.     rts    
  563.  
  564. QC_sampleoffset:
  565.     moveq #0,d0
  566.     move.b t_cmdarg(a6),d0
  567.     beq QC_sook
  568.     move.b d0,t_sampleoffset(a6)
  569. QC_sook:move.b t_sampleoffset(a6),d0
  570.     asl.w #8,d0
  571.     moveq #0,d1
  572.     move.w t_length(a6),d1
  573.     sub.l d0,d1
  574.     ble QC_sotoolong
  575.     move.w d1,t_length(a6)
  576.     add.l d0,d0
  577.     add.l d0,t_start(a6)
  578.     move.l t_start(a6),(a5)
  579.     move.w t_length(a6),4(a5)
  580.     rts
  581. QC_sotoolong:
  582.     move.w #1,t_length(a6)
  583.     move.w t_length(a6),4(a5)
  584.     rts
  585.     
  586. QC_volslide:
  587.     moveq #0,d0
  588.     move.b t_cmdarg(a6),d0
  589.     lsr.w #4,d0
  590.     beq QC_volslidedown
  591.     add.w d0,t_volume(a6)
  592.     cmp.w #$40,t_volume(a6)    
  593.     blt QC_setvol
  594.     move.w #$40,t_volume(a6)
  595. QC_setvol:move.w t_volume(a6),8(a5)
  596.     rts
  597. QC_volslidedown:
  598.     move.b t_cmdarg(a6),d0
  599.     sub.w d0,t_volume(a6)
  600.     tst.w t_volume(a6)    
  601.     bgt QC_setvol
  602.     clr.w t_volume(a6)
  603.     clr.w 8(a5)
  604.     rts        
  605.  
  606. QC_posjump:
  607.     move.b t_cmdarg(a6),QC_newposnr+1
  608.     move.b #1,QC_newposflag
  609.     clr.w QC_newrow
  610.     rts        
  611.  
  612. QC_volumechange:
  613.     move.b t_cmdarg(a6),d0
  614.     cmp.b #$40,d0
  615.     blo QC_volchhigh
  616.     move.w #$40,t_volume(a6)
  617.     move.w #$40,8(a5)
  618.     rts
  619. QC_volchhigh:
  620.     move.b d0,t_volume+1(a6)
  621.     move.w t_volume(a6),8(a5)
  622.     rts
  623.  
  624. QC_patternbreak:
  625.     move.w QC_pos,d0
  626.     addq.w #1,d0
  627.     move.w d0,QC_newposnr
  628.     move.b t_cmdarg(a6),QC_newrow+1
  629.     move.b #1,QC_newposflag
  630.     rts
  631.  
  632. QC_setspeed:
  633.     move.b t_cmdarg(a6),d0
  634.     beq QC_setspeed1
  635.     cmp.b #$1f,d0
  636.     bhi QC_end
  637.     move.b d0,QC_speed+1
  638.     clr.w QC_speedcount
  639.     rts
  640. QC_setspeed1:
  641.     move.w #1,QC_speed
  642.     clr.w QC_speedcount
  643.     rts
  644.  
  645. QC_setfilter:
  646.     move.b t_cmdarg(a6),d0
  647.     and.b #1,d0
  648.     add.b d0,d0
  649.     and.b #$fd,$bfe001
  650.     or.b d0,$bfe001
  651.     rts
  652.  
  653. QC_fineslideup:
  654.     move.b t_cmdarg(a6),d0
  655.     and.w #$f,d0
  656.     sub.w d0,t_period(a6)
  657.     cmp.w #113,t_period(a6)
  658.     bgt QC_fsunotlow
  659.     move.w #113,t_period(a6)
  660. QC_fsunotlow:
  661.     move.w t_period(a6),6(a5)
  662.     rts
  663.  
  664. QC_fineslidedown:
  665.     move.b t_cmdarg(a6),d0
  666.     and.w #$f,d0
  667.     add.w d0,t_period(a6)
  668.     cmp.w #856,t_period(a6)
  669.     blt QC_fsdnothigh
  670.     move.w #856,t_period(a6)
  671. QC_fsdnothigh:
  672.     move.w t_period(a6),6(a5)
  673.     rts    
  674.     
  675. QC_glisscontrol:
  676.     move.b t_cmdarg(a6),t_glisscont(a6)
  677.     and.b #$f,t_glisscont(a6)
  678.     rts
  679.  
  680. QC_vibratowave:
  681.     move.b t_cmdarg(a6),t_vibwave(a6)
  682.     and.b #$f,t_vibwave(a6)
  683.     rts
  684.  
  685. QC_finetune:
  686.     move.b t_cmdarg(a6),d0
  687.     and.w #$f,d0
  688.     add.w d0,d0
  689.     add.w d0,d0
  690.     move.l (a3,d0.w),t_finetune(a6)
  691.     rts
  692.     
  693. QC_jumploop:
  694.     move.b t_cmdarg(a6),d0
  695.     and.w #$f,d0
  696.     beq QC_saveloop
  697.     tst.b QC_loopcount
  698.     beq QC_saveloop
  699.     subq.b #1,QC_loopcount
  700.     beq QC_mend
  701.     move.b #1,QC_jumpbreakflag
  702.     rts    
  703. QC_newloop:
  704.     move.b d0,QC_loopcount
  705.     move.b #1,QC_jumpbreakflag
  706.     rts    
  707. QC_saveloop:
  708.     move.w QC_rowcount(pc),QC_looprow
  709.     rts
  710.  
  711. QC_tremolowave:
  712.     move.b t_cmdarg(a6),t_tremwave(a6)
  713.     and.b #$f,t_tremwave(a6)
  714.     rts
  715.  
  716. QC_initretrig:
  717.     clr.b t_retrig(a6)
  718. QC_retrignote:
  719.     addq.b #1,t_retrig(a6)
  720.     move.b t_cmdarg(a6),d0
  721.     and.b #$f,d0
  722.     cmp.b t_retrig(a6),d0
  723.     bgt QC_mend
  724.     clr.b t_retrig(a6)
  725.     move.w t_dmabit(a6),d0
  726.     or.w d0,QC_dmacon
  727.     move.l t_start(a6),(a5)
  728.     move.w t_length(a6),4(a5)
  729.     move.w t_period(a6),6(a5)
  730.     rts
  731.  
  732. QC_volumefineup:
  733.     move.b t_cmdarg(a6),d0
  734.     and.w #$f,d0
  735.     add.w d0,t_volume(a6)
  736.     cmp.w #$40,t_volume(a6)
  737.     blt QC_vfuset
  738.     move.w #$40,t_volume(a6)
  739.     move.w #$40,8(a5)
  740.     rts
  741. QC_vfuset:move.w t_volume(a6),8(a5)
  742.     rts    
  743.  
  744. QC_volumefinedown:
  745.     move.b t_cmdarg(a6),d0
  746.     and.w #$f,d0
  747.     sub.w d0,t_volume(a6)
  748.     bge QC_vfdset
  749.     clr.w t_volume(a6)
  750.     clr.w 8(a5)
  751.     rts
  752. QC_vfdset:move.w t_volume(a6),8(a5)
  753.     rts    
  754.  
  755. QC_notecut:
  756.     moveq #0,d1
  757.     move.b t_cmdarg(a6),d1
  758.     and.b #$f,d1
  759.     cmp.w QC_speedcount(pc),d1
  760.     bgt QC_mend
  761.     clr.w t_volume(a6)
  762.     clr.w 8(a5)
  763.     rts
  764.  
  765. QC_notedelay:
  766.     moveq #0,d1
  767.     move.b t_cmdarg(a6),d1
  768.     and.b #$f,d1
  769.     cmp.w QC_speedcount(pc),d1
  770.     bne QC_mend
  771.     move.w t_dmabit(a6),d0
  772.     or.w d0,QC_dmacon
  773.     move.l t_start(a6),(a5)
  774.     move.w t_length(a6),4(a5)
  775.     move.w t_period(a6),6(a5)
  776.     rts
  777.  
  778. QC_patterndelay:
  779.     move.b t_cmdarg(a6),QC_pattwait
  780.     and.b #$f,QC_pattwait
  781.     rts
  782.  
  783. QC_arptbl:rept 86        ;if your assembler doensn't want to handle
  784.     dc.b -1,0,1        ;the "rept" command, you'll have to write
  785.     endr            ;a list incl. 256 numbers like this:
  786.                 ;-1,0,1,-1,0,1,-1.. and so on.
  787.  
  788.  
  789. QC_playfx:dc.l QC_arpeggio
  790.     dc.l QC_slideup
  791.     dc.l QC_slidedown
  792.     dc.l QC_toneport
  793.     dc.l QC_vibrato
  794.     dc.l QC_toneportandvolslide
  795.     dc.l QC_vibratoandvolslide
  796.     dc.l QC_tremolo
  797.     dc.l QC_mend
  798.     dc.l QC_mend
  799.     dc.l QC_volslide
  800.     dc.l QC_mend
  801.     dc.l QC_mend
  802.     dc.l QC_mend
  803.     dc.l QC_playecommands    
  804.     dc.l QC_mend
  805.  
  806. QC_playefx:dc.l QC_mend
  807.     dc.l QC_mend
  808.     dc.l QC_mend
  809.     dc.l QC_mend
  810.     dc.l QC_mend
  811.     dc.l QC_mend
  812.     dc.l QC_mend
  813.     dc.l QC_mend
  814.     dc.l QC_mend
  815.     dc.l QC_retrignote
  816.     dc.l QC_mend
  817.     dc.l QC_mend
  818.     dc.l QC_notecut
  819.     dc.l QC_notedelay
  820.     dc.l QC_mend
  821.     dc.l QC_mend
  822.  
  823. QC_efx:    dc.l QC_setfilter
  824.     dc.l QC_fineslideup
  825.     dc.l QC_fineslidedown
  826.     dc.l QC_glisscontrol
  827.     dc.l QC_vibratowave
  828.     dc.l QC_finetune
  829.     dc.l QC_jumploop
  830.     dc.l QC_tremolowave
  831.     dc.l QC_mend
  832.     dc.l QC_initretrig
  833.     dc.l QC_volumefineup
  834.     dc.l QC_volumefinedown
  835.     dc.l QC_notecut
  836.     dc.l QC_notedelay
  837.     dc.l QC_patterndelay
  838.     dc.l QC_mend
  839.     
  840.  
  841. QC_fxaftersetperiod:
  842.     dc.l QC_arpeggio
  843.     dc.l QC_mend
  844.     dc.l QC_mend
  845.     dc.l QC_mend
  846.     dc.l QC_mend
  847.     dc.l QC_mend
  848.     dc.l QC_mend
  849.     dc.l QC_mend
  850.     dc.l QC_mend
  851.     dc.l QC_sampleoffset
  852.     dc.l QC_mend
  853.     dc.l QC_posjump
  854.     dc.l QC_volumechange
  855.     dc.l QC_patternbreak
  856.     dc.l QC_ecommands
  857.     dc.l QC_setspeed        
  858.  
  859.  
  860. QC_vibtables:
  861.     dc.w 0,3211,6392,9511,12539,15446,18204,20787,23169,25329
  862.     dc.w 27244,28897,30272,31356,32137,32609,32767,32609,32137
  863.     dc.w 31356,30272,28897,27244,25329,23169,20787,18204,15446
  864.     dc.w 12539,9511,6392,3211
  865.     dc.w 0,-3211,-6392,-9511,-12539,-15446,-18204,-20787,-23169,-25329
  866.     dc.w -27244,-28897,-30272,-31356,-32137,-32609,-32767,-32609,-32137
  867.     dc.w -31356,-30272,-28897,-27244,-25329,-23169,-20787,-18204,-15446
  868.     dc.w -12539,-9511,-6392,-3211
  869.  
  870.     dc.w 32767,31744,30720,29696,28672,27648,26624,25600,24576,23552
  871.     dc.w 22528,21504,20480,19456,18432,17408,16384,15360,14336,13312
  872.     dc.w 12288,11264,10240,9216,8192,7168,6144,5120,4096,3072,2048,1024
  873.     dc.w 0,-1024,-2048,-3072,-4096,-5120,-6144,-8168,-8192,-9216,-10240
  874.     dc.w -11264,-12288,-13312,-14336,-15360,-16384,-17408,-18432,-19456
  875.     dc.w -20480,-21504,-22528,-23552,-24576,-25600,-26624,-27648,-28672
  876.     dc.w -29696,-30720,-31744,-32768
  877.  
  878.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  879.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  880.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  881.     dc.w 32767,32767
  882.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  883.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  884.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  885.     dc.w -32767,-32767
  886.     
  887.  
  888.  
  889.  
  890. QC_periods:dc.l QC_periodtable
  891.     dc.l QC_periodtable+72
  892.     dc.l QC_periodtable+144
  893.     dc.l QC_periodtable+216
  894.     dc.l QC_periodtable+288
  895.     dc.l QC_periodtable+360
  896.     dc.l QC_periodtable+432
  897.     dc.l QC_periodtable+504
  898.     dc.l QC_periodtable+576
  899.     dc.l QC_periodtable+648
  900.     dc.l QC_periodtable+720
  901.     dc.l QC_periodtable+792
  902.     dc.l QC_periodtable+864
  903.     dc.l QC_periodtable+936
  904.     dc.l QC_periodtable+1008
  905.     dc.l QC_periodtable+1080
  906.  
  907.  
  908. QC_periodtable:
  909.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  910.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  911.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  912.  
  913.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  914.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  915.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  916.  
  917.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  918.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  919.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  920.  
  921.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  922.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  923.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  924.  
  925.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  926.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  927.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  928.  
  929.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  930.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  931.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  932.  
  933.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  934.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  935.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  936.  
  937.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  938.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  939.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  940.  
  941.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  942.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  943.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  944.  
  945.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  946.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  947.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  948.  
  949.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  950.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  951.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  952.  
  953.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  954.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  955.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  956.  
  957.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  958.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  959.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  960.  
  961.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  962.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  963.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  964.  
  965.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  966.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  967.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  968.  
  969.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  970.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  971.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  972.  
  973.  
  974. QC_samplepointers:
  975.     blk.l 256,QC_quietsamp    
  976. QC_patternpointers:
  977.     blk.l 256,0
  978. QC_currpattpointer:dc.l 0
  979. QC_posstart:dc.l 0
  980. QC_nrofpos:dc.w 0
  981. QC_pos:    dc.w 0
  982. QC_speed:dc.w 6
  983. QC_speedcount:dc.w 0
  984. QC_breakrow:dc.w 0
  985. QC_newrow:dc.w 0
  986. QC_newposnr:dc.w 0
  987. QC_rowcount:dc.w 0
  988. QC_quiet:dc.w 0
  989. QC_dmacon:dc.w 0
  990. QC_looprow:dc.w 0
  991. QC_tempo:dc.w 125
  992. QC_oldirq:dc.l 0
  993. QC_newposflag:dc.b 0
  994. QC_jumpbreakflag:dc.b 0
  995. QC_loopcount:dc.b 0
  996. QC_pattwait:dc.b 0
  997.  
  998. QC_quietsamp:
  999.     dc.w 0,1
  1000.     blk.b 20
  1001.     dc.w 0
  1002.     dc.w 1
  1003.     dc.l QC_quiet
  1004.  
  1005.  
  1006.  
  1007. t_notenr = 1
  1008. t_cmd = 2
  1009. t_cmdarg = 3
  1010. t_repeat = 4
  1011. t_replen = 8
  1012. t_period = 10
  1013. t_volume = 12
  1014. t_length = 14
  1015. t_finetune = 42
  1016. t_start = 18
  1017. t_dmabit = 22
  1018. t_notenr2 = 24
  1019. t_wantedperiod = 26
  1020. t_portdir = 28
  1021. t_vibwave = 29
  1022. t_glisscont = 30
  1023. t_vibcmd = 31
  1024. t_vibpos = 32
  1025. t_tremwave = 34
  1026. t_tremcmd = 35
  1027. t_trempos = 36
  1028. t_sampleoffset = 38
  1029. t_retrig = 39
  1030. t_portspeed = 40
  1031.     even
  1032. QC_chan1:dc.l 0            ;The note and command
  1033.     dc.l 0            ;Repeat
  1034.     dc.w 0            ;Replen
  1035.     dc.w 0            ;Period
  1036.     dc.w 0            ;Volume
  1037.     dc.w 0            ;Length
  1038.     dc.w 0            ;Finetune
  1039.     dc.l 0            ;Start
  1040.     dc.w 1            ;DMAbit
  1041.     dc.w 0            ;NoteNr2
  1042.     dc.w 0            ;WantedPeriod
  1043.     dc.b 0            ;Portdir
  1044.     dc.b 0            ;VibWave
  1045.     dc.b 0            ;Glisscont
  1046.     dc.b 0            ;Vibcmd
  1047.     dc.w 0            ;VibPos
  1048.     dc.b 0            ;Tremwave
  1049.     dc.b 0            ;Tremcmd
  1050.     dc.w 0            ;Trempos
  1051.     dc.b 0            ;Sampleoffset
  1052.     dc.b 0            ;Retrig
  1053.     dc.b 0            ;Portspeed
  1054.     dc.b 0            ;
  1055.     dc.l 0            ;FineTune
  1056.  
  1057.     even
  1058. QC_chan2:dc.l 0
  1059.     dc.l 0
  1060.     dc.w 0
  1061.     dc.w 0
  1062.     dc.w 0
  1063.     dc.w 0
  1064.     dc.w 0
  1065.     dc.l 0
  1066.     dc.w 2
  1067.     dc.w 0
  1068.     dc.w 0
  1069.     dc.b 0
  1070.     dc.b 0
  1071.     dc.b 0
  1072.     dc.b 0
  1073.     dc.w 0
  1074.     dc.b 0
  1075.     dc.b 0
  1076.     dc.w 0
  1077.     dc.b 0
  1078.     dc.b 0
  1079.     dc.b 0
  1080.     dc.b 0
  1081.     dc.l 0
  1082.  
  1083.     even
  1084. QC_chan3:dc.l 0
  1085.     dc.l 0
  1086.     dc.w 0
  1087.     dc.w 0
  1088.     dc.w 0
  1089.     dc.w 0
  1090.     dc.w 0
  1091.     dc.l 0
  1092.     dc.w 4
  1093.     dc.w 0
  1094.     dc.w 0
  1095.     dc.b 0
  1096.     dc.b 0
  1097.     dc.b 0
  1098.     dc.b 0
  1099.     dc.w 0
  1100.     dc.b 0
  1101.     dc.b 0
  1102.     dc.w 0
  1103.     dc.b 0
  1104.     dc.b 0
  1105.     dc.b 0
  1106.     dc.b 0
  1107.     dc.l 0
  1108.  
  1109.     even
  1110. QC_chan4:dc.l 0
  1111.     dc.l 0
  1112.     dc.w 0
  1113.     dc.w 0
  1114.     dc.w 0
  1115.     dc.w 0
  1116.     dc.w 0
  1117.     dc.l 0
  1118.     dc.w 8
  1119.     dc.w 0
  1120.     dc.w 0
  1121.     dc.b 0
  1122.     dc.b 0
  1123.     dc.b 0
  1124.     dc.b 0
  1125.     dc.w 0
  1126.     dc.b 0
  1127.     dc.b 0
  1128.     dc.w 0
  1129.     dc.b 0
  1130.     dc.b 0
  1131.     dc.b 0
  1132.     dc.b 0
  1133.     dc.l 0
  1134.  
  1135.     even
  1136. QC_data:            ;Your module here!
  1137.  
  1138.  
  1139.  
  1140.